package daos;

import java.util.List;

import datos.Automovil;
import datos.Usuario;
import dtos.ResumenPersonaDto;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 * Session Bean implementation class UsuarioDAO
 * 
 * @version 1.0
 * @author Andres Mejia -Fabio Giraldo
 * 
 * @param Usuario
 *            hace referencia a la entidad que va hacer manejada por el DAO.
 * @param String
 *            especifica cual es el tipo de dato de la llave primaria de la
 *            entidad.
 * 
 */
@Stateless
@LocalBean
public class UsuarioDAO extends DAO<Usuario, String> {

	/**
	 * Default constructor.
	 */
	public UsuarioDAO()
	{
		// TODO Auto-generated constructor stub
	}

	@Override
	protected Class<Usuario> getEntityClass() 
	{
		// TODO Auto-generated method stub
		return Usuario.class;
	}

	/**
	 * 
	 * @param nombre corresponde al nombre por el que se buscaran los usuarios.
	 * @return query.getResultList() retorna la lista de usuarios que se llaman por un nombre dado.
	 */
	public List<Usuario> usuariosNombre(String nombre)
	{
		Query query = entityManager
				.createQuery("select p from Persona p where p.nombre=:atributo");
		query.setParameter("atributo", nombre);
		query = query.setFirstResult(0);
		return query.getResultList();
	}
	
	/**
	 * 
	 * @param email corresponde al email del usuario que se necesita buscar.
	 * @return query.getSingleResult() retorna el usuario que se busco.
	 */
	public Usuario usuarioEmail(String email)
	{
		Query query = entityManager
				.createQuery("select p from Persona p where p.email=:atributo");
		query.setParameter("atributo", email);
		return (Usuario) query.getSingleResult();
	}
	
	public List<ResumenPersonaDto>resumen()
	{
		Query query=entityManager.
		createQuery("select new dtos.ResumenPersonaDto(per.nombre,per.email,per.direccion) from Persona per");
		return query.getResultList();
	}
	
	public List<Usuario>correosEspecificos(String correo)
	{
		Query query = entityManager
		.createQuery("select usuario from Usuario usuario where usuario.email LIKE:parametro " );
		query.setParameter("parametro",correo);
		return query.getResultList();
	}
	
	public List<Usuario>usuariosSinCalificacion()
	{
		Query query = entityManager.
		createQuery("select usuario from Usuario usuario where usuario.calificaciones IS EMPTY" ); 
		return query.getResultList();
	}
	
	public List<Usuario>usuariosSinTelefonoYDireccion()
	{
		Query query = entityManager.
		createQuery	("select usuario from Usuario usuario where usuario.telefono IS NULL or usuario.direccion IS NULL " );
		return query.getResultList();
	}
	
	public String totalOfertasUsuario(String cedula)
	{
		Query query = entityManager
		.createQuery("select SUM(oferta.valorOfertado) from Usuario usuario INNER JOIN usuario.ofertas oferta where usuario.cedula=:parametro" );
		query.setParameter("parametro", cedula);
		return ""+query.getSingleResult();
	}
	
	public List<Usuario> PromedioCalificacionUsuario()
	{
		Query query = entityManager.createQuery
		("select calificacion.usuario,AVG(calificacion.puntage) from Calificacion calificacion GROUP BY calificacion.usuario" );
		return query.getResultList();
	}
	
	public List<String> getCedulaUsuarios()
	{
		Query query = entityManager.createQuery
		("select usuario.cedula from Usuario usuario" );
		return query.getResultList();
	}
	
//	public List<Usuario> CalificacionesMayores()
//	{
//		Query query = entityManager.createQuery
//		("select calificacion.usuario,AVG(calificacion.puntage) from Calificacion calificacion GROUP BY calificacion.usuario HAVING AVG(calificacion.puntage)>=5");
//		return query.getResultList();
//	}

}
